package com.mazaiting.classfile.constant.info;

import com.mazaiting.classfile.ClassReader;
import com.mazaiting.classfile.constant.ConstantPool;

import java.nio.charset.Charset;

/**
 * 放的是MUTF-8编码的字符串
 * MUTF-8编码方式和UTF-8大致相同，但并不兼容。 差别有两点：一是null字符（代码点U+0000）会被编码成2字节： 0xC0、0x80；
 * 二是补充字符（Supplementary Characters，代码点大于 U+FFFF的Unicode字符）是按UTF-16拆分为代理对（Surrogate Pair） 分别编码的
 * @author mazaiting
 * @since 2021/8/11
 */
public class ConstantUtf8Info extends ConstantInfo {
    /**
     * 字符串
     */
    private String str;

    public ConstantUtf8Info(ConstantPool pool, short tag) {
        super(pool, tag);
    }

    @Override
    public void readInfo(ClassReader reader) {
        // 先读取两个字节, 指定长度  无符号 u2
        int length = reader.readU2ToUnsignedShort();
        // 再读取指定字节的长度
        // TODO 需更换为 java.io.DataInputStream.readUTF()
        this.str = new String(reader.readBytes(length), Charset.defaultCharset());
    }

    /**
     * 获取字符串
     * @return 字符串
     */
    public String string() {
        return str;
    }

    @Override
    public String toString() {
        return "ConstantUtf8Info{" +
                "str='" + str + '\'' +
                '}';
    }
}


















